encyklopedia.space

xUnit.net

xUnit.net (często określany po prostu jako xUnit) jest otwarto‑źródłowym frameworkiem do testowania jednostkowego przeznaczonym dla platformy .NET. Został zaprojektowany przez Jamesa N. Greene’a, współtwórcę NUnit, i po raz pierwszy udostępniony w 2007 roku. Framework jest szeroko stosowany w środowiskach programistycznych opartych na językach C#, F# i VB.NET, a także w projektach wykorzystujących ASP.NET oraz Xamarin.

Historia

Powstanie xUnit.net było odpowiedzią na krytykę istniejących frameworków testowych, m.in. NUnit i MSTest, które w tamtym okresie posiadały pewne ograniczenia związane z architekturą i integracją z najnowszymi wersjami platformy .NET. Pierwsza wersja (1.0) została wydana w 2007 roku, a od tego czasu projekt jest rozwijany w ramach GitHub (repozytorium wewnętrzne) i przyjmuje wkład społeczności.

Architektura i kluczowe cechy

  • Modularność – xUnit.net składa się z kilku projektów NuGet (np. xunit, xunit.runner.visualstudio, xunit.runner.console), co umożliwia elastyczne dobieranie komponentów.
  • Integracja z Visual Studio – dzięki paczce xunit.runner.visualstudio testy są automatycznie wykrywane i uruchamiane w oknie Test Explorer.
  • Wsparcie dla ciągłej integracji – istnieją oficjalne runner’y dla Azure DevOps, Jenkins i innych serwerów CI.
  • Obsługa atrybutów – testy są definiowane przy użyciu atrybutów takich jak [Fact] (test jednorazowy) oraz [Theory] (test parametryzowany).
  • Rozbudowany system asercji – biblioteka xunit.assert umożliwia precyzyjne sprawdzanie wyników, w tym asercje dla wyjątków, kolekcji i asynchronicznych metod.
  • Wsparcie dla DI – testy mogą korzystać z wbudowanego mechanizmu wstrzykiwania zależności, co upraszcza przygotowanie środowiska testowego.
  • „Fact” vs „Theory” – rozróżnienie pozwala na lepszą organizację testów parametryzowanych oraz umożliwia użycie danych źródłowych (np. InlineData, MemberData).

Podstawowa składnia

Poniżej przedstawiono minimalny przykład testu jednostkowego w xUnit.net:

using Xunit;

public class KalkulatorTests
{
    [Fact]
    public void Dodaj_TwoNumbers_ReturnsCorrectSum()
    {
        // Arrange
        var kalkulator = new Kalkulator();

        // Act
        var wynik = kalkulator.Dodaj(2, 3);

        // Assert
        Assert.Equal(5, wynik);
    }

    [Theory]
    [InlineData(1, 2, 3)]
    [InlineData(-4, 5, 1)]
    public void Dodaj_RóżneDane_ZwracaPoprawnąWartość(int a, int b, int oczekiwany)
    {
        var kalkulator = new Kalkulator();
        var wynik = kalkulator.Dodaj(a, b);
        Assert.Equal(oczekiwany, wynik);
    }
}

Integracja z narzędziami

Framework xUnit.net można łatwo zintegrować z:

Porównanie z innymi frameworkami

Cecha NUnit MSTest xUnit.net
Wsparcie atrybutów Fact/Theory Nie Nie Tak
Domyślna integracja z Visual Studio Tak (przez rozszerzenie) Tak Tak (przez xunit.runner.visualstudio)
Wsparcie dla DI Ograniczone Ograniczone Pełne
Testy asynchroniczne Tak Tak Tak (naturalna obsługa async Task)
Community‑driven (open source) Tak Nie (Microsoft) Tak

Współpraca z innymi technologiami .NET

xUnit.net jest kompatybilny z najnowszymi wersjami platformy .NET Core oraz .NET 5/6/7. Dzięki temu można testować aplikacje:

  • serwisy ASP.NET Core (przy użyciu WebApplicationFactory<TEntryPoint>)
  • aplikacje konsolowe (dotnet run)
  • aplikacje mobilne (Xamarin i MAUI)
  • biblioteki klasy (.dll)

Praktyki i zalecenia

  1. Używaj [Fact] do testów, które nie przyjmują parametrów.
  2. Stosuj [Theory] oraz atrybuty [InlineData] lub [MemberData] dla testów parametryzowanych.
  3. Wykorzystuj IClassFixture<T> i CollectionFixture do współdzielenia kosztownych zasobów (np. połączenia z bazą danych).
  4. Utrzymuj testy szybkie i izolowane – unikać zależności od zewnętrznych usług w testach jednostkowych.
  5. Stosuj asercje z biblioteki xunit.assert oraz dodatkowe rozszerzenia, takie jak FluentAssertions (link wewnętrzny: FluentAssertions).

Zobacz także

Framework xUnit.net pozostaje jednym z najczęściej wybieranych narzędzi do testowania w ekosystemie .NET, zapewniając nowoczesną, elastyczną i dobrze zintegrowaną platformę dla programistów tworzących oprogramowanie o wysokiej jakości.